const fs = require("fs");
// const babylon = require("babylon");
const path = require("path");
// 用于将源码生成AST
const parser = require('@babel/parser')
// 对AST节点进行递归遍历 找到import 引用节点
const traverse = require('@babel/traverse').default
// 将获得的ES6的AST转化成ES5
const { transformFromAst } = require('@babel/core')


module.exports = {
  // 将文件转换为AST语法树
  getAst: path => {
    // 读取入口文件
    const content = fs.readFileSync(path, 'utf-8')
    // 将文件内容转为AST抽象语法树
    return parser.parse(content, {
      sourceType: 'module'
    })
  },

  // 遍历AST，将用到的依赖收集起来
  getDependecies: (ast, filename) => {
    const dependecies = {}
    // 遍历所有的 import 模块,存入dependecies
    traverse(ast, {
      // 可以从AST语法树中看到，类型为 ImportDeclaration 的 AST 节点 (即为import 语句)，node就是对应的依赖
      ImportDeclaration({ node }) {
        // 获取到项目路径
        const dirname = path.dirname(filename)
        // 保存依赖模块路径,之后生成依赖关系图需要用到
        const filepath = './' + path.join(dirname, node.source.value)
        // 相对路径改为项目路径 
        // dependecies: { './aa.js': './src/aa.js', './hh.js': './src/hh.js' }
        dependecies[node.source.value] = filepath
      }
    })
    return dependecies
  },

  // 将ES6转换为ES5语法
  transform: ast => {
    // AST转换为code
    const { code } = transformFromAst(ast, null, {
      presets: ['@babel/preset-env']
    })
    return code
  }
}



